Micron Document
Livres et Wikis | Archives | Info


JavaScript
part 15/19 Β· 71.2 KB total
layout: Wide Β· Narrow Β· Centered
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
l'ensemble des variables non locales qu'elle a capturΓ©, soit par valeur
(conservation d'une copie de chaque donnΓ©e liΓ©e aux variables non
locales), soit par rΓ©fΓ©rence (conservation d'une rΓ©fΓ©rence Γ  chaque
donnΓ©e liΓ©e aux variables non locales). Comme en JavaScript toutes les
variables sont de type rΓ©fΓ©rence (cf. la section
Liaison des identifiants), JavaScript n'utilise que la capture par
rΓ©fΓ©rence β€” ce qui correspond en C++ 11 Γ  la syntaxe [&](…) { … }; β€”, et
la durΓ©e de vie des variables non locales capturΓ©es par une fonction est
Γ©tendue Γ  la durΓ©e de vie de la fonction β€” ce qui n'est pas le cas en
C++ 11, quel que soit le type de capture :

function maFonction() {
var maVariable = 4; // variable parente
return function () {
alert(maVariable);
}
}
var maFermeture = maFonction(); // capture de la variable parente par
rΓ©fΓ©rence
maFermeture(); // affiche 4

Expressions de fonctions immΓ©diatement invoquΓ©es

Jusqu'Γ  ECMAScript 6, JavaScript ne proposait pas nativement de portΓ©e
des variables au niveau des blocs (pas de mots-clΓ© let ou const), ni de
modules. Pour Γ©viter de polluer l'espace global, une mΓ©thode consistait
Γ  encapsuler son code dans une fonction pour s'appuyer sur la portΓ©e des
variables qui a lieu au niveau des fonctions en JavaScript, puis Γ 
invoquer cette fonction juste après. Pour regrouper les deux étapes
(dΓ©finition de la fonction et invocation) et ne pas ajouter un nom de
fonction supplΓ©mentaire dans l'espace global, le langage permet les
expressions de fonctions immΓ©diatement invoquΓ©es (EFII ; en anglais
immediately-invoked function expressions, IIFE)cite-ref-30[30].

Plusieurs syntaxes sont possibles pour ce type d'expression, les plus
rΓ©pandues Γ©tant :

β€’ (function (…) { … }(…)); (syntaxe recommandΓ©e par Douglas Crockford
pour sa lisibilitΓ©)cite-ref-31[31] ;
β€’ (function (…) { … })(…);

L'opΓ©rateur d'invocation de fonction () Γ  la fin permet l'exΓ©cution
immédiate de la fonction. Les parenthèses en gras indiquent à
l'analyseur syntaxique qu'elles contiennent une expression, car en
JavaScript les parenthèses ne peuvent pas contenir de déclaration.
Autrement, dans la plupart des situations, le mot clΓ© function est
traitΓ© comme une dΓ©claration de fonction, et pas comme une expression de
fonction. Il existe d'autres faΓ§ons pour forcer une expression de
fonction :

β€’ !function (…) { … }(…);
β€’ ~function (…) { … }(…);
β€’ -function (…) { … }(…);
β€’ +function (…) { … }(…);

Dans les contextes oΓΉ une expression est attendue il n'est pas
nécessaire d'utiliser les parenthèses en gras :

β€’ var maVariable = function (…) { … }(…);
β€’ true && function (…) { … }(…);
β€’ 0, function (…) { … }(…);

Une utilisation importante des expressions de fonctions immΓ©diatement
invoquΓ©es est pour la crΓ©ation de modules. Les modules permettent Γ  la
fois de rassembler des propriΓ©tΓ©s et des mΓ©thodes dans un espace de nom
et de rendre certains membres privΓ©s :

var compteur = (function () {
var i = 0; // propriΓ©tΓ© privΓ©e
return { // mΓ©thodes publiques
obtenir: function () {

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────